package com.hym.network;

import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

import android.content.Context;

import com.android.volley.AuthFailureError;
import com.android.volley.NetworkError;
import com.android.volley.NetworkResponse;
import com.android.volley.NoConnectionError;
import com.android.volley.ServerError;
import com.android.volley.TimeoutError;
import com.android.volley.VolleyError;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.hym.hymvolley.R;

/**
 * Class description: 对Volley的失败的回调，VolleyError对象处理的封装。
 * Volley的error出现的时候，会回调ErrorListener中的接口回调的方法onErrorResponse
 * 。这个方法中会接受VolleyError 的一个对象，所以对Volley错误的封装，只需要对这个VolleyError 对象的值进行不同的处理。
 * 
 * @author HuYuMian
 * @QQ 732476506
 * @date 2015-7-13
 * @version 1.5
 * @modification
 */

public class VolleyErrorHelper {
	// 在创建一个请求时，需要添加一个错误监听onErrorResponse。如果请求发生异常，会返回一个VolleyError实例。
	// 以下是Volley的异常列表：
	// AuthFailureError：如果在做一个HTTP的身份验证，可能会发生这个错误。
	// NetworkError：Socket关闭，服务器宕机，DNS错误都会产生这个错误。
	// NoConnectionError：和NetworkError类似，这个是客户端没有网络连接。
	// ParseError：在使用JsonObjectRequest或JsonArrayRequest时，如果接收到的JSON是畸形，会产生异常。
	// SERVERERROR：服务器的响应的一个错误，最有可能的4xx或5xx HTTP状态代码。
	// TimeoutError：Socket超时，服务器太忙或网络延迟会产生这个异常。默认情况下，Volley的超时时间为2.5秒。如果得到这个错误可以使用RetryPolicy。
	public static String getMessage(Object error, Context context) {
		// 对以上的错误进行分来
		// 1.请求超时的异常，TODO:超时的异常可以做额外的处理，目前先暂时不处理
		if (error instanceof TimeoutError) {

		} else if (isNetWorkProblem(error)) {
			
		} else if(isServerProblem(error)){
			handleServerError(error,context);
		}
		return null;
	}

	/**
	 * 异常分类，网络异常
	 * 
	 * @param error
	 * @return
	 */
	public static boolean isNetWorkProblem(Object error) {
		return (error instanceof NetworkError)
				|| (error instanceof NoConnectionError);
	}

	/**
	 * 异常分类，服务器异常
	 * 
	 * @param error
	 * @return
	 */
	public static boolean isServerProblem(Object error) {
		return (error instanceof ServerError)
				|| (error instanceof AuthFailureError);
	}

	/**
	 * 对服务器异常的处理
	 * 
	 * @param error
	 * @param context
	 */
	public static String handleServerError(Object err, Context context) {
		VolleyError error = (VolleyError) err;
		NetworkResponse response = error.networkResponse;
		if (response != null) {
			switch (response.statusCode) {
			case 404:
			case 422:
			case 401:
				// 注意:如下的type的处理方式，是对泛型类的处理方式。普通的类，直接通过className.getClass()。
				Type type = new TypeToken<Map<String, String>>() {
				}.getType();
				HashMap<String, String> result = new Gson().fromJson(
						new String(response.data), type);
				if (result != null && result.containsKey("error")) {
					return result.get("error");
				}
				// invalid request
				return error.getMessage();

			default:
				return context.getResources().getString(
						R.string.generic_server_down);
			}
		}
		return context.getResources().getString(R.string.generic_error);
	}
}
